package com.atguigu.tingshu.album.service.impl;

import com.atguigu.tingshu.album.mapper.AlbumAttributeValueMapper;
import com.atguigu.tingshu.album.mapper.AlbumInfoMapper;
import com.atguigu.tingshu.album.mapper.AlbumStatMapper;
import com.atguigu.tingshu.album.service.AlbumAttributeValueService;
import com.atguigu.tingshu.album.service.AlbumInfoService;
import com.atguigu.tingshu.common.constant.SystemConstant;
import com.atguigu.tingshu.model.album.AlbumAttributeValue;
import com.atguigu.tingshu.model.album.AlbumInfo;
import com.atguigu.tingshu.model.album.AlbumStat;
import com.atguigu.tingshu.query.album.AlbumInfoQuery;
import com.atguigu.tingshu.vo.album.AlbumAttributeValueVo;
import com.atguigu.tingshu.vo.album.AlbumInfoVo;
import com.atguigu.tingshu.vo.album.AlbumListVo;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.stream.Collectors;

@Slf4j
@Service
@SuppressWarnings({"unchecked", "rawtypes"})
public class AlbumInfoServiceImpl extends ServiceImpl<AlbumInfoMapper, AlbumInfo> implements AlbumInfoService {

	@Autowired
	private AlbumInfoMapper albumInfoMapper;

	@Autowired
	private AlbumStatMapper albumStatMapper;

	@Autowired
	private AlbumAttributeValueMapper albumAttributeValueMapper;

	@Override
	public String upload(MultipartFile file) {
		return null;
	}

	@Autowired
	private AlbumAttributeValueService albumAttributeValueService;

	@Override
	@Transactional(rollbackFor = Exception.class)
	public void saveAlbumInfo(AlbumInfoVo albumInfoVo, Long userId) {
		// 创建专辑对象
		AlbumInfo albumInfo = new AlbumInfo();
		// 进行属性拷贝
		BeanUtils.copyProperties(albumInfoVo, albumInfo);
		// 用户id
		albumInfo.setUserId(userId);
		// 审核状态
		albumInfo.setStatus(SystemConstant.ALBUM_STATUS_PASS);
		// 设置免费的集数
		if (!SystemConstant.ALBUM_PAY_TYPE_FREE.equals(albumInfoVo.getPayType())) {
			// 只要收费就设置前五集为免费试听
			albumInfo.setTracksForFree(5);
		}
		// 插入完成之后获取到专辑 albumInfo id
		albumInfoMapper.insert(albumInfo);

		// album_attribute_value
		List<AlbumAttributeValueVo> albumAttributeValueVoList = albumInfoVo.getAlbumAttributeValueVoList();
		if (!CollectionUtils.isEmpty(albumAttributeValueVoList)) {

			List<AlbumAttributeValue> albumAttributeValueList = albumAttributeValueVoList.stream().map(albumAttributeValueVo -> {
				AlbumAttributeValue albumAttributeValue = new AlbumAttributeValue();
				albumAttributeValue.setAlbumId(albumInfo.getId());
				BeanUtils.copyProperties(albumAttributeValueVo, albumAttributeValue);
				return albumAttributeValue;
			}).collect(Collectors.toList());

			// 批量插入
			albumAttributeValueService.saveBatch(albumAttributeValueList);
		}

		// album_stat
		this.saveAlbumStat(albumInfo.getId(), SystemConstant.ALBUM_STAT_PLAY);
		this.saveAlbumStat(albumInfo.getId(), SystemConstant.ALBUM_STAT_SUBSCRIBE);
		this.saveAlbumStat(albumInfo.getId(), SystemConstant.ALBUM_STAT_BROWSE);
		this.saveAlbumStat(albumInfo.getId(), SystemConstant.ALBUM_STAT_COMMENT);
	}

	@Override
	public List<AlbumInfo> findUserAllAlbumList(Long userId) {
		// 默认查看第一页
		Page<AlbumInfo> albumInfoPage = new Page<>(1, 100);

		// 设置查询条件
		LambdaQueryWrapper<AlbumInfo> queryWrapper = new LambdaQueryWrapper<>();
		queryWrapper.select(AlbumInfo::getId, AlbumInfo::getAlbumTitle);
		queryWrapper.eq(AlbumInfo::getUserId, userId);
		queryWrapper.orderByDesc(AlbumInfo::getId);

		// 返回查询记录
		return albumInfoMapper.selectPage(albumInfoPage, queryWrapper).getRecords();
	}

	@Override
	@Transactional(rollbackFor = Exception.class)
	public void updateAlbumInfo(Long id, AlbumInfoVo albumInfoVo) {
		AlbumInfo albumInfo = new AlbumInfo();
		albumInfo.setId(id);
		BeanUtils.copyProperties(albumInfoVo, albumInfo);
		// 根据id修改数据
		albumInfoMapper.updateById(albumInfo);

		// 先删除专辑属性数据
		albumAttributeValueMapper.delete(new LambdaQueryWrapper<AlbumAttributeValue>().eq(AlbumAttributeValue::getAlbumId, id));

		// 保存专辑属性
		List<AlbumAttributeValueVo> albumAttributeValueVoList = albumInfoVo.getAlbumAttributeValueVoList();

		if (!CollectionUtils.isEmpty(albumAttributeValueVoList)) {
			List<AlbumAttributeValue> albumAttributeValueList = albumAttributeValueVoList.stream().map(albumAttributeValueVo -> {
				AlbumAttributeValue albumAttributeValue = new AlbumAttributeValue();
				BeanUtils.copyProperties(albumAttributeValueVo, albumAttributeValue);
				albumAttributeValue.setAlbumId(id);
				return albumAttributeValue;
			}).collect(Collectors.toList());

			albumAttributeValueService.saveBatch(albumAttributeValueList);
		}
	}

	@Override
	public AlbumInfo getAlbumInfoById(Long id) {
		AlbumInfo albumInfo = this.getById(id);
		if (albumInfo != null) {
			List<AlbumAttributeValue> albumAttributeValueList = albumAttributeValueMapper.selectList(new LambdaQueryWrapper<AlbumAttributeValue>().eq(AlbumAttributeValue::getAlbumId, id));
			albumInfo.setAlbumAttributeValueVoList(albumAttributeValueList);
		}
		return albumInfo;
	}

	@Override
	@Transactional(rollbackFor = Exception.class)
	public void removeAlbumInfo(Long id) {
		albumInfoMapper.deleteById(id);
		albumStatMapper.delete(new LambdaQueryWrapper<AlbumStat>().eq(AlbumStat::getAlbumId, id));
		albumAttributeValueMapper.delete(new LambdaQueryWrapper<AlbumAttributeValue>().eq(AlbumAttributeValue::getAlbumId, id));
	}

	@Override
	public IPage<AlbumListVo> getUserAlbumPage(Page<AlbumListVo> albumListVoPage, AlbumInfoQuery albumInfoQuery) {
		return albumInfoMapper.selectUserAlbumPage(albumListVoPage, albumInfoQuery);
	}

	private void saveAlbumStat(Long albumId, String statPlay) {
		AlbumStat albumStat = new AlbumStat();
		albumStat.setAlbumId(albumId);
		albumStat.setStatType(statPlay);
		albumStat.setStatNum(0);
		albumStatMapper.insert(albumStat);
	}
}
